<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 原型链继承
    // - 缺点：父类当中提供的属性方法全部都来原型链。这些数据和方法对于实例而言是共享的。容易造成数据的混乱。
    //        在定义子类的显示对象时，如果赋值的是父级的实例化对象，那么传递参数不方便
    // // 1- 定义父类
    // function Box(userName){
    //     this.userName = userName;
    // }
    // Box.prototype.run = function(){
    //     console.log(this.userName);
    // }
    // // 2- 定义子类
    // function Desk(){
    //     this.age = 18;
    // }
    // // 3- 实现继承
    // Desk.prototype = new Box("zhangsan");
    // Desk.prototype.constructor = Desk;
    // // 4- 实例化对象
    // const obj = new Desk();
    // const obj2 = new Desk();
    // console.log(obj.age,obj.userName);// 18 zhangsan
    // console.log(obj.__proto__ === Desk.prototype);
    // console.log(Desk.prototype.__proto__ === Box.prototype);
    // console.log(Box.prototype.__proto__ === Object.prototype);
    // console.log(Object.prototype.__proto__);
    //
    // console.log(obj.constructor === Desk);// true
    // console.log(obj.constructor === Box);// false
    //
    // obj2.__proto__.userName = "lisi";
    // console.log(obj.userName);


    // 冒充继承：借用构造函数继承:只能够继承父类当中的实例，不会继承原型。
    // - 缺点：无法继承父类的原型对象的。
    // function Box(userName){
    //     this.userName = userName;
    // }
    // Box.prototype.run = function(){
    //     console.log(this.userName);
    // }
    // function Desk(){
    //     Box.apply(this,Array.from(arguments));
    //     this.age = 12;
    // }
    //
    // const obj = new Desk("lisi");
    // const obj2 = new Desk("zhangsan");
    // console.log(obj,obj2);
    // obj.run();



    // 组合继承
    function Box(userName){
        this.userName = userName;
    }
    Box.prototype.run = function(){
        console.log(this.userName);
    }
    function Desk(userName){
        // Box.apply(this,Array.from(arguments));
        Box.call(this,userName);
        this.age = 12;
    }
    Desk.prototype = Box.prototype;
    Desk.constructor = Desk;


    const obj = new Desk("lisi");
    const obj2 = new Desk("zhangsan");
    obj2.userName = "wangwu";
    console.log(obj.userName);



</script>
</html>